package main

import (
	"github.com/astaxie/beego/context"

	"github.com/astaxie/beego"
)

type HomeController struct {
	beego.Controller
}

func (c *HomeController) Get() {
	// 如果没有指定响应，则会去找views/homecontroller/get.tpl 文件，如果没有就报错
	c.Ctx.Output.Body([]byte("HomeControllerGet"))
}

func (c *HomeController) Post() {
	// 如果没有指定响应，则会去找views/homecontroller/get.tpl 文件，如果没有就报错
	c.Ctx.Output.Body([]byte("HomeController.Post"))
}

func (c *HomeController) Create() {
	// POST
	c.Ctx.Output.Body([]byte("Create"))
}

func (c *HomeController) Modify() {
	// Put
	c.Ctx.Output.Body([]byte("Modify"))
}

func (c *HomeController) Delete() {
	// Delete
	c.Ctx.Output.Body([]byte("Delete"))
}

func (c *HomeController) Any() {
	// Other
	c.Ctx.Output.Body([]byte("Any"))
}

type UserController struct {
	beego.Controller
}

func (c *UserController) Get() {
	c.Ctx.Output.Body([]byte("UserController.get: " + c.Ctx.Input.Param(":id")))
}

type AuthController struct {
	beego.Controller
}

func (c *AuthController) Login() {
	c.Ctx.Output.Body([]byte("login"))
}

func (c *AuthController) Logout() {

	switch c.Ctx.Input.Method() {
	case "GET":
		c.Ctx.Output.Body([]byte("get Logout"))
	case "POST":
		c.Ctx.Output.Body([]byte("post Logout"))
	default:
		c.Ctx.Output.Body([]byte("defalut Logout"))
	}

}

func main() {

	// 定义处理器

	// 绑定URL和处理器的功能 路由

	// 基本路由

	// 为URL绑定某个请求方法的路由函数

	// 为根路径的Get方法绑定函数
	// POST, DELETE, HEAD, PUT, OPTIONS, PATCH
	// 路由从上往下找，没个请求方法都需要绑定URL

	beego.Get("/", func(ctx *context.Context) {
		ctx.Output.Body([]byte("hi beego"))
	})

	beego.Post("/", func(ctx *context.Context) {
		ctx.Output.Body([]byte("post"))
	})

	// 绑定所有的请求方法
	beego.Any("/", func(ctx *context.Context) {
		ctx.Output.Body([]byte("any"))
	})

	// 正则路由 数值解析到参数中

	// id后面括号中写符合id的正则表达式
	beego.Any(`/delete/:id(\d{1,8})/`, func(ctx *context.Context) {
		ctx.Output.Body([]byte("delete" + ctx.Input.Param(":id")))
		// 获取路由中的参数
		// ctx.Input.Param(":id")
	})

	// id 限制数值int
	beego.Any(`/get/:id:int/`, func(ctx *context.Context) {
		ctx.Output.Body([]byte("get" + ctx.Input.Param(":id")))
	})

	// 匹配user开头的路径，ctx.Input.Param(":splat") 获取user之后的patch
	beego.Any(`/user/*`, func(ctx *context.Context) {
		ctx.Output.Body([]byte("user:" + ctx.Input.Param(":splat")))

	})

	// 匹配path中带文件名的路径，ctx.Input.Param(":path") 获取文件名，ctx.Input.Param(":ext")获取文件后缀
	beego.Any(`/file/*.*`, func(ctx *context.Context) {
		ctx.Output.Body([]byte("user:" + ctx.Input.Param(":path") + "." + ctx.Input.Param(":ext")))

	})

	beego.Router("/home", &HomeController{})
	beego.Router("/users/?:id/", &UserController{})
	// 启动beego

	// 请求方式绑定函数 Create是方法名称
	beego.Router("/method/", &HomeController{}, "POST:Create;PUT:Modify;GET:Get;DELETE:Delete;*:Any")

	beego.AutoRouter(&AuthController{})
	beego.Run(":19999")

}
